https://map-rfun.library.duke.edu/01_georeference.html

# install.packages("RPostgreSQL")
# install.packages("compare")
# install.packages("igraph")
# install.packages("rworldmap")
# install.packages("maps")
# install.packages("ggplot2")
# install.packages("tidyverse")
# install.packages("sf")
# install.packages("mapview")
# install.packages("dplyr")
library("RPostgreSQL")
Loading required package: DBI
library("compare")

Attaching package: ‘compare’

The following object is masked from ‘package:base’:

    isTRUE
library("igraph")

Attaching package: ‘igraph’

The following object is masked from ‘package:compare’:

    compare

The following objects are masked from ‘package:stats’:

    decompose, spectrum

The following object is masked from ‘package:base’:

    union
library("maps")
library("ggplot2")
library("rworldmap")
Loading required package: sp
### Welcome to rworldmap ###
For a short introduction type :      vignette('rworldmap')
library("tidyverse")
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ tibble  3.1.6     ✓ dplyr   1.0.9
✓ tidyr   1.2.0     ✓ stringr 1.4.0
✓ readr   2.1.2     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::as_data_frame() masks tibble::as_data_frame(), igraph::as_data_frame()
x purrr::compose()       masks igraph::compose()
x tidyr::crossing()      masks igraph::crossing()
x dplyr::filter()        masks stats::filter()
x dplyr::groups()        masks igraph::groups()
x dplyr::lag()           masks stats::lag()
x purrr::map()           masks maps::map()
x purrr::simplify()      masks igraph::simplify()
library("sf")
Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.0
library("mapview")
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library("dplyr")

# Load the PostgreSQL driver, create a connection to the postgres database, and employ it.
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname = "mycodb", host = "localhost", port = 5432, user = "ruser", password = "ruser")
sql_string <- paste("SELECT * FROM mycodb", sep="")
MycoDB <- data.frame(dbGetQuery(con, sql_string))

#Set the working directory for files.
FileDirectory <- paste("/home/daiten/Programming/R/Projects/MycoDB/Graphics/", sep="")

Let’s map it all.


# get map
worldmap <- getMap(resolution = "coarse")
# plot world map
plot(worldmap, col = "lightgrey", fill = T, border = "darkgray", xlim = c(-180, 180), ylim = c(-90, 90), bg = "aliceblue", asp = 1, wrap=c(-180,180))


map()
starbucks <- read.csv("https://raw.githubusercontent.com/libjohn/mapping-with-R/master/data/All_Starbucks_Locations_in_the_US_-_Map.csv")
starbucksNC <- starbucks
starbucksNC
mapview(starbucksNC, xcol = "Longitude", ycol = "Latitude", crs = 4269, grid = FALSE)

# Neat piping
# starbucksNC <- starbucks  %>% 
#   filter(starbucks$State == "AZ")
# 
# starbucksNC %>% glimpse()

Now let’s test it with our own data. Make sure mapview doesn’t get any NA or non numeric characters for xcol or ycol…haha….don’t do it.

suillus <-  subset(MycoDB, MycoDB$fungalgenus == "rhizoglomus")
suillus1 <- subset(suillus, is.na(suillus$fung_lat) == FALSE)
suillus2 <- subset(suillus1, is.na(suillus1$fung_long) == FALSE)

suilluslat <- as.numeric(suillus2$fung_lat) 
suilluslon <- as.numeric(suillus2$fung_long)

mapview(data.frame(lat = suilluslat, lon = suilluslon, mycorrhizae = suillus2$mycorrhizaetype, plant = suillus2$plantfamily), xcol="lon", ycol="lat", grid = FALSE, crs = 4269)
# mapview(suillus2, xcol=as.numeric(suillus2$fung_long), ycol=as.numeric(suillus2$fung_lat) , grid = FALSE, crs = 4269)

Scraps


# chords <- rbind(lat = as.numeric(suillus1$fung_lat), lon = as.numeric(suillus1$fung_lon))

# chords <- 

# typeof(chords[,1])
# chords[,2]

# mapview(suillus1, cbind(lat = as.numeric(suillus1$fung_lat), lon = as.numeric(suillus1$fung_lon)), xcol="lon", ycol="lat", grid = FALSE, crs = NA)
mapview(data.frame( lat = suillus1$fung_lat, lon = suillus1$fung_lon), xcol="lon", ycol="lat", grid = FALSE, crs = NA)
# mapview(chords, xcol="lon", ycol="lat", grid = FALSE, crs = NA)
# mapview(suillus1, xcol=chords[,2], ycol=chords[,1], grid = FALSE, crs = NA)


# Neat piping
# starbucksNC <- starbucks  %>% 
#   filter(starbucks$State == "AZ")
# 
# starbucksNC %>% glimpse()
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpodHRwczovL21hcC1yZnVuLmxpYnJhcnkuZHVrZS5lZHUvMDFfZ2VvcmVmZXJlbmNlLmh0bWwKIAoKYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcygiUlBvc3RncmVTUUwiKQojIGluc3RhbGwucGFja2FnZXMoImNvbXBhcmUiKQojIGluc3RhbGwucGFja2FnZXMoImlncmFwaCIpCiMgaW5zdGFsbC5wYWNrYWdlcygicndvcmxkbWFwIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJtYXBzIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQojIGluc3RhbGwucGFja2FnZXMoInNmIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJtYXB2aWV3IikKIyBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmxpYnJhcnkoIlJQb3N0Z3JlU1FMIikKbGlicmFyeSgiY29tcGFyZSIpCmxpYnJhcnkoImlncmFwaCIpCmxpYnJhcnkoIm1hcHMiKQpsaWJyYXJ5KCJnZ3Bsb3QyIikKbGlicmFyeSgicndvcmxkbWFwIikKbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgic2YiKQpsaWJyYXJ5KCJtYXB2aWV3IikKbGlicmFyeSgiZHBseXIiKQoKIyBMb2FkIHRoZSBQb3N0Z3JlU1FMIGRyaXZlciwgY3JlYXRlIGEgY29ubmVjdGlvbiB0byB0aGUgcG9zdGdyZXMgZGF0YWJhc2UsIGFuZCBlbXBsb3kgaXQuCmRydiA8LSBkYkRyaXZlcigiUG9zdGdyZVNRTCIpCmNvbiA8LSBkYkNvbm5lY3QoZHJ2LCBkYm5hbWUgPSAibXljb2RiIiwgaG9zdCA9ICJsb2NhbGhvc3QiLCBwb3J0ID0gNTQzMiwgdXNlciA9ICJydXNlciIsIHBhc3N3b3JkID0gInJ1c2VyIikKc3FsX3N0cmluZyA8LSBwYXN0ZSgiU0VMRUNUICogRlJPTSBteWNvZGIiLCBzZXA9IiIpCk15Y29EQiA8LSBkYXRhLmZyYW1lKGRiR2V0UXVlcnkoY29uLCBzcWxfc3RyaW5nKSkKCiNTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcy4KRmlsZURpcmVjdG9yeSA8LSBwYXN0ZSgiL2hvbWUvZGFpdGVuL1Byb2dyYW1taW5nL1IvUHJvamVjdHMvTXljb0RCL0dyYXBoaWNzLyIsIHNlcD0iIikKYGBgCgpMZXQncyBtYXAgaXQgYWxsLgpgYGB7cn0KCiMgZ2V0IG1hcAp3b3JsZG1hcCA8LSBnZXRNYXAocmVzb2x1dGlvbiA9ICJjb2Fyc2UiKQojIHBsb3Qgd29ybGQgbWFwCnBsb3Qod29ybGRtYXAsIGNvbCA9ICJsaWdodGdyZXkiLCBmaWxsID0gVCwgYm9yZGVyID0gImRhcmtncmF5IiwgeGxpbSA9IGMoLTE4MCwgMTgwKSwgeWxpbSA9IGMoLTkwLCA5MCksIGJnID0gImFsaWNlYmx1ZSIsIGFzcCA9IDEsIHdyYXA9YygtMTgwLDE4MCkpCgoKbWFwKCkKCmBgYAoKYGBge3J9CnN0YXJidWNrcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2xpYmpvaG4vbWFwcGluZy13aXRoLVIvbWFzdGVyL2RhdGEvQWxsX1N0YXJidWNrc19Mb2NhdGlvbnNfaW5fdGhlX1VTXy1fTWFwLmNzdiIpCnN0YXJidWNrc05DIDwtIHN0YXJidWNrcwpzdGFyYnVja3NOQwptYXB2aWV3KHN0YXJidWNrc05DLCB4Y29sID0gIkxvbmdpdHVkZSIsIHljb2wgPSAiTGF0aXR1ZGUiLCBjcnMgPSA0MjY5LCBncmlkID0gRkFMU0UpCmBgYApOb3cgbGV0J3MgdGVzdCBpdCB3aXRoIG91ciBvd24gZGF0YS4gCk1ha2Ugc3VyZSBtYXB2aWV3IGRvZXNuJ3QgZ2V0IGFueSBOQSBvciBub24gbnVtZXJpYyBjaGFyYWN0ZXJzIGZvciB4Y29sIG9yIHljb2wuLi5oYWhhLi4uLmRvbid0IGRvIGl0LgpgYGB7cn0Kc3VpbGx1cyA8LSAgc3Vic2V0KE15Y29EQiwgTXljb0RCJGZ1bmdhbGdlbnVzID09ICJyaGl6b2dsb211cyIpCnN1aWxsdXMxIDwtIHN1YnNldChzdWlsbHVzLCBpcy5uYShzdWlsbHVzJGZ1bmdfbGF0KSA9PSBGQUxTRSkKc3VpbGx1czIgPC0gc3Vic2V0KHN1aWxsdXMxLCBpcy5uYShzdWlsbHVzMSRmdW5nX2xvbmcpID09IEZBTFNFKQoKc3VpbGx1c2xhdCA8LSBhcy5udW1lcmljKHN1aWxsdXMyJGZ1bmdfbGF0KSAKc3VpbGx1c2xvbiA8LSBhcy5udW1lcmljKHN1aWxsdXMyJGZ1bmdfbG9uZykKCm1hcHZpZXcoZGF0YS5mcmFtZShsYXQgPSBzdWlsbHVzbGF0LCBsb24gPSBzdWlsbHVzbG9uLCBteWNvcnJoaXphZSA9IHN1aWxsdXMyJG15Y29ycmhpemFldHlwZSwgcGxhbnQgPSBzdWlsbHVzMiRwbGFudGZhbWlseSksIHhjb2w9ImxvbiIsIHljb2w9ImxhdCIsIGdyaWQgPSBGQUxTRSwgY3JzID0gNDI2OSkKIyBtYXB2aWV3KHN1aWxsdXMyLCB4Y29sPWFzLm51bWVyaWMoc3VpbGx1czIkZnVuZ19sb25nKSwgeWNvbD1hcy5udW1lcmljKHN1aWxsdXMyJGZ1bmdfbGF0KSAsIGdyaWQgPSBGQUxTRSwgY3JzID0gNDI2OSkKYGBgCgoKCgpTY3JhcHMKYGBge3J9CgojIGNob3JkcyA8LSByYmluZChsYXQgPSBhcy5udW1lcmljKHN1aWxsdXMxJGZ1bmdfbGF0KSwgbG9uID0gYXMubnVtZXJpYyhzdWlsbHVzMSRmdW5nX2xvbikpCgojIGNob3JkcyA8LSAKCiMgdHlwZW9mKGNob3Jkc1ssMV0pCiMgY2hvcmRzWywyXQoKIyBtYXB2aWV3KHN1aWxsdXMxLCBjYmluZChsYXQgPSBhcy5udW1lcmljKHN1aWxsdXMxJGZ1bmdfbGF0KSwgbG9uID0gYXMubnVtZXJpYyhzdWlsbHVzMSRmdW5nX2xvbikpLCB4Y29sPSJsb24iLCB5Y29sPSJsYXQiLCBncmlkID0gRkFMU0UsIGNycyA9IE5BKQptYXB2aWV3KGRhdGEuZnJhbWUoIGxhdCA9IHN1aWxsdXMxJGZ1bmdfbGF0LCBsb24gPSBzdWlsbHVzMSRmdW5nX2xvbiksIHhjb2w9ImxvbiIsIHljb2w9ImxhdCIsIGdyaWQgPSBGQUxTRSwgY3JzID0gTkEpCiMgbWFwdmlldyhjaG9yZHMsIHhjb2w9ImxvbiIsIHljb2w9ImxhdCIsIGdyaWQgPSBGQUxTRSwgY3JzID0gTkEpCiMgbWFwdmlldyhzdWlsbHVzMSwgeGNvbD1jaG9yZHNbLDJdLCB5Y29sPWNob3Jkc1ssMV0sIGdyaWQgPSBGQUxTRSwgY3JzID0gTkEpCgoKIyBOZWF0IHBpcGluZwojIHN0YXJidWNrc05DIDwtIHN0YXJidWNrcyAgJT4lIAojICAgZmlsdGVyKHN0YXJidWNrcyRTdGF0ZSA9PSAiQVoiKQojIAojIHN0YXJidWNrc05DICU+JSBnbGltcHNlKCkKYGBg